package builder

// Builder 生成器接口，定义创建一个产品对象所需的各个部件的操作
type Builder interface {
	// BuildPart1 示意方法，构建某个部件
	BuildPart1()
	BuildPart2()
	BuildPart3()
}

// Product 被构建的产品对象的接口
type Product struct {
	// 定义产品的操作
	Content string
}

// ConcreteBuilderA 具体的生成器对象
type ConcreteBuilderA struct {
	// 生成器最终构建的产品对象
	resultProduct Product
}

func (c *ConcreteBuilderA) BuildPart1() {
	// 构建某个功能部件处理
	c.resultProduct.Content += "A1"
}

func (c *ConcreteBuilderA) BuildPart2() {
	// 构建某个功能部件处理
	c.resultProduct.Content += "A2"
}

func (c *ConcreteBuilderA) BuildPart3() {
	// 构建某个功能部件处理
	c.resultProduct.Content += "A3"
}

// ConcreteBuilderB 具体的生成器对象
type ConcreteBuilderB struct {
	// 生成器最终构建的产品对象
	resultProduct Product
}

func (c *ConcreteBuilderB) BuildPart1() {
	// 构建某个功能部件处理
	c.resultProduct.Content += "B1"
}

func (c *ConcreteBuilderB) BuildPart2() {
	// 构建某个功能部件处理
	c.resultProduct.Content += "B2"
}

func (c *ConcreteBuilderB) BuildPart3() {
	// 构建某个功能部件处理
	c.resultProduct.Content += "B3"
}

// Director 指导者，指导使用生成器的接口来构建产品对象
type Director struct {
	// 持有当前需要使用的生成器对象
	builder Builder
}

// NewDirector 构造方法，传入生成器对象
func NewDirector(builder Builder) *Director {
	return &Director{
		builder: builder,
	}
}

// Construct 示意方法，指导生成器构建最终的产品对象
func (d *Director) Construct() {
	// 通过使用生成器接口来构建最终的产品对象
	d.builder.BuildPart1()
	d.builder.BuildPart2()
	d.builder.BuildPart3()
}
